import pygame
from settings import *
from support import *
from entity import Entity

class Player(Entity):
    def __init__(self, 初始位置, 精灵组, 障碍精灵组, 绘制武器, 销毁武器,使用魔法):
        super().__init__(精灵组)
        self.image = pygame.image.load('../graphics/test/player.png').convert_alpha()
        self.rect = self.image.get_rect(topleft=初始位置)
        self.碰撞区域 = self.rect.inflate(0, -26)

        # 视图设置
        self.导入动画视图()
        self.动作 = 'down'

        self.速度 = 5
        self.障碍精灵组 = 障碍精灵组

        # 攻击设置
        self.是否正在攻击 = False
        self.攻击冷却时间 = 400
        self.开始攻击时间 = None

        # 武器
        self.绘制武器 = 绘制武器
        self.销毁武器 = 销毁武器
        self.武器索引 = 0
        self.武器 = list(武器库.keys())[self.武器索引]
        self.是否可以切换武器 = True
        self.开始切换武器的时间 = None
        self.切换冷却时间 = 200

        # 法术
        self.法术索引 = 0
        self.法术 = list(法术库.keys())[self.法术索引]
        self.是否可以切换法术 = True
        self.开始切换法术的时间 = None
        

        # 数据
        self.数据 = {'健康值': 100, '能量值': 60, '攻击力': 10, '魔法伤害': 4, '速度': 5}
        self.满状态 = {'健康值': 300, '能量值': 140, '攻击力': 20, '魔法伤害': 10, '速度': 10}
        self.升级数据 = {'健康值': 100, '能量值': 100, '攻击力': 100, '魔法伤害': 100, '速度': 100}
        self.血 = self.数据['健康值'] * 0.5
        self.蓝 = self.数据['能量值'] * 0.8
        self.经验 = 123
        self.速度 = self.数据['速度']

        # 伤害
        self.无敌时间 = 500

    def 导入动画视图(self):
        动画路径前缀 = '../graphics/player/'
        self.动画字典 = {'up': [], 'down': [], 'left': [], 'right': [],
                         'right_idle': [], 'left_idle': [], 'up_idle': [], 'down_idle': [],
                         'right_attack': [], 'left_attack': [], 'up_attack': [], 'down_attack': []}

        for 动画 in self.动画字典.keys():
            完整路径 = 动画路径前缀 + 动画
            self.动画字典[动画] = 导入视图(完整路径)

    def 获取动作(self):
        # 不动的动作
        if self.方向.x == 0 and self.方向.y == 0:
            if not 'idle' in self.动作 and not 'attack' in self.动作:
                self.动作 = self.动作 + '_idle'

        # 攻击的动作
        if self.是否正在攻击:
            self.方向.x = 0
            self.方向.y = 0
            if not 'attack' in self.动作:
                if 'idle' in self.动作:
                    self.动作 = self.动作.replace('_idle', '_attack')
                else:
                    self.动作 = self.动作 + '_attack'
        else:
            if 'attack' in self.动作:
                self.动作 = self.动作.replace('_attack', '')

    def 输入(self):
        if not self.是否正在攻击:
            keys = pygame.key.get_pressed()
            if keys[pygame.K_UP]:
                self.方向.y = -1
                self.动作 = 'up'
            elif keys[pygame.K_DOWN]:
                self.方向.y = 1
                self.动作 = 'down'
            else:
                self.方向.y = 0

            if keys[pygame.K_LEFT]:
                self.方向.x = -1
                self.动作 = 'left'
            elif keys[pygame.K_RIGHT]:
                self.方向.x = 1
                self.动作 = 'right'
            else:
                self.方向.x = 0

            # 攻击
            if keys[pygame.K_SPACE]:
                self.是否正在攻击 = True
                self.开始攻击时间 = pygame.time.get_ticks()
                self.绘制武器()

            # 魔法攻击
            if keys[pygame.K_LCTRL]:
                self.是否正在攻击 = True
                self.开始攻击时间 = pygame.time.get_ticks()
                print('法攻')

            # 切换武器
            if keys[pygame.K_q] and self.是否可以切换武器:
                self.是否可以切换武器 = False
                self.开始切换武器的时间 = pygame.time.get_ticks()

                if self.武器索引 < len(list(武器库.keys())) - 1:
                    self.武器索引 += 1
                else:
                    self.武器索引 = 0

                self.武器 = list(武器库.keys())[self.武器索引]

            # 切换武器
            if keys[pygame.K_e] and self.是否可以切换法术:
                self.是否可以切换法术 = False
                self.开始切换法术的时间 = pygame.time.get_ticks()

                if self.法术索引 < len(list(法术库.keys())) - 1:
                    self.法术索引 += 1
                else:
                    self.法术索引 = 0

                self.法术 = list(法术库.keys())[self.法术索引]

    def 动画(self):
        动作动画 = self.动画字典[self.动作]
        self.动作帧 += self.动画切换速度
        if self.动作帧 >= len(动作动画):
            self.动作帧 = 0

        self.image = 动作动画[int(self.动作帧)]
        self.rect = self.image.get_rect(center=self.碰撞区域.center)

        if not self.是否可以收到伤害:
            闪烁 = self.伤害闪烁()
            self.image.set_alpha(闪烁)
        else:
            self.image.set_alpha(255)

    def 冷却(self):
        当前时间 = pygame.time.get_ticks()

        if self.是否正在攻击:
            if 当前时间 - self.开始攻击时间 >= self.攻击冷却时间:
                self.是否正在攻击 = False
                self.销毁武器()

        if not self.是否可以切换武器:
            if 当前时间 - self.开始切换武器的时间 >= self.切换冷却时间:
                self.是否可以切换武器 = True

        if not self.是否可以切换法术:
            if 当前时间 - self.开始切换法术的时间 >= self.切换冷却时间:
                self.是否可以切换法术 = True

        if not self.是否可以收到伤害:
            if 当前时间 - self.伤害开始时间 >= self.无敌时间:
                self.是否可以收到伤害 = True

    def 武器伤害总和(self):
        基础伤害 = self.数据['攻击力']
        武器伤害 = 武器库[self.武器]['伤害']
        return 基础伤害 + 武器伤害

    def update(self):
        self.输入()
        self.冷却()
        self.获取动作()
        self.动画()
        self.移动(self.速度)
